<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/exceptions/DataBaseException.php';

/**
 * Абстрактный класс, отвечающий за работу с БД
 */
class DataBase {
	const SERVER = 'localhost';
	const PORT = 3306;
	const NAME = 'smk';
	const USER = 'smk';
	const PASSWORD = 'smk';
	const ENCODING = 'utf8';

	protected $connection = null;
	protected $result = null;

	// Не очень хорошое место.Лудше переделать get'ер для каждого метода.
	public function __get($name){
		return $this->$name;
	}

	public function __construct() {
		try {
			// формируем DSN - имя источника данных
			$dsn = 'mysql:host='.self::SERVER.';port='.self::PORT.';dbname='.self::NAME.';charset='.self::ENCODING;
			$options = array(PDO::ATTR_PERSISTENT => true);// Этот параметр говорит, что будем использовать постоянное подключение
			$this->connection = new PDO($dsn,self::USER,self::PASSWORD, $options);
			$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
				

			//array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); так ставилась кодировка до PHP 5.3.6
			// Если версия более поздняя, то в DNS прописываем параметр ...;charset=utf8;...
				
			//= @mysql_pconnect(self::SERVER.':'.self::PORT, self::USER, self::PASSWORD);
			// = new PDO('mysql:host=localhost;port=...;dbname=test', $user, $pass,array(PDO::ATTR_PERSISTENT => true));

		} catch (PDOException $e) {
			throw new DataBaseException($e->getCode(), $e->getMessage());
		}
	}
	// Выполнить запрос PDO
	final public function query($stmt) {
		$this->result = $stmt;
		$result = $this->result->execute();
		if(!$result) {
			$array = $this->connection->errorInfo();
			throw new DataBaseException($this->connection->errorCode(), $array[0]);
		}
	}
	// Выполнить SQL запрос
	final public function execute($statement){
		$this->result = $this->connection->query($statement); // Вернется объект PDOStatment
		if($this->result == null) {
			$array = $this->connection->errorInfo();
			throw new DataBaseException($this->connection->errorCode(), $array[0]);
		}
	}

	final public function row() {
		return $this->result->fetch(PDO::FETCH_ASSOC);
	}

	final public function identity() {
		return $this->connection->lastInsertId();
	}

	final public function close() {
		$this->result->closeCursor();
		//$dbh = null;
	}

}
?>